use axum::{
    Json,
    http::Request,
    response::Response,
    middleware::Next, 
    body::Body
};
use serde_json::Value;

use crate::{auth::claims::{get_req_role, get_req_roles}, code};

// 验证超级管理员权限
pub async fn auth(req: Request<Body>, next: Next) -> Result<Response, Json<Value>>{ 
    get_req_role(req, next, |r|{
        if r.eq(&0) {
            Ok(())
        }else{
            Err(code::err_("权限不足"))
        }
    }).await
}
// 验证超级管理员与授权权限
pub async fn auth_roles(req: Request<Body>, next: Next, role:i32) -> Result<Response, Json<Value>> {
    get_req_roles(req, next, |r, rs|{
        if r.is_some() && r.unwrap().eq(&0) {
            Ok(())
        }else{
            if rs.is_some() && rs.unwrap().contains(&role) {
                Ok(())
            }else{
                Err(code::err_("权限不足"))
            }
        }
    }).await
}
pub async fn auth_roles_group(req: Request<Body>, next: Next, role:Vec<i32>) -> Result<Response, Json<Value>> {
    get_req_roles(req, next, |r, rs|{
        if r.is_some() && r.unwrap().eq(&0) {
            Ok(())
        }else{
            if rs.is_some() {
                let mut b=false;
                for rle in role.iter() {
                    b = rs.to_owned().unwrap().contains(&rle);
                    if b {
                        break;
                    }
                }
                if b {
                    Ok(())
                }else{
                    Err(code::err_("权限不足"))
                }
            }else{
                Err(code::err_("权限不足"))
            }
        }
    }).await
}